package com.cskaoyan.javase.array._5operation._5copy;

import java.util.Arrays;

/**
 * 数组元素的拷贝
 *
 * @since 14:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] old = {1, 2, 3, 4, 1, 2, 3, 1, 1, 2, 3, 1, 1, 13, 3, 1, 3, 4};
        /*int[] newArr = addElementByCopyArr(_0old, 5);
        System.out.println(Arrays.toString(newArr));*/
        int[] newArr = deleteElementByCopyArr(old, 1);
        System.out.println(Arrays.toString(newArr));
    }

    // 需求1:给一个int数组,然后新增一个元素(真正新增一个元素)
    /*
        新建一个数组,然后将老数组拷贝过去,然后再新增一个元素
        方法内部创建数组,需要返回给外界去使用
     */
    public static int[] addElementByCopyArr(int[] oldArr, int element) {
        // 1.创建新数组,动态初始化一个新数组,它的长度是老数组长度 + 1
        int[] newArr = new int[oldArr.length + 1];
        // 2.将老数组的元素全部复制到新数组,这个时候还剩最后一个空位置
        /*
            具体来说,遍历老数组,然后给新数组赋值
         */
        // 在上面定义新数组的下标,从0开始
        int newIndex = 0;
        for (int oleEle : oldArr) {
            newArr[newIndex] = oleEle;
            newIndex++;
        }
        // 遍历赋值后,只剩最后一个位置没有元素(只有默认值)
        // 3.把新元素赋值进去(插入到最后一个元素)
        newArr[newArr.length - 1] = element;
        return newArr;
    }


    // 需求2: 删除数组中的某个元素(真正的删除
    /*
        数组是不可能真正直接删除元素,所以新建一个数组,然后拷贝元素(不是被删除的元素都复制进去)
        当然,删除元素时,该元素在数组中完全可能不止一个
     */
    public static int[] deleteElementByCopyArr(int[] oldArr, int target) {
        // 1.新建一个数组,它的长度是旧数组减去要删除元素的个数,所以我们要先统计有几个元素被删除了
        // 1.1 统计被删除元素的个数,计数功能的实现,需要先定义一个计数器
        int count = 0;
        // 1.2 遍历老数组,找到要删除元素的个数
        for (int ele : oldArr) {
            if (ele == target) {
                // 找到一个,计数器就加1
                count++;
            }
        }
        // 1.3 程序运行到这里,count就是数组中要删除元素的个数
        int[] newArr = new int[oldArr.length - count];

        // 2.仍然是复制元素,只不过在复制时要排除那些被删除的元素,跳过
        // 2.1 遍历老数组,然后给新数组赋值
        // 在上面定义新数组的下标,从0开始
        int newIndex = 0;
        for (int ele : oldArr) {
            if (ele == target) {
                // 被删除的元素,不需要复制了,直接跳过
                continue;
            }
            // 代码运行到这里,元素都不是要删除的,就复制到新数组
            newArr[newIndex] = ele;
            newIndex++;
        }
        // 代码运行到这里,删除元素的工作就完成了!
        // 3.返回新数组
        return newArr;
    }

}
